package drugdealer.persistencia;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Iterator;
import java.util.Vector;

import drugdealer.dados.Consulta;
import drugdealer.dados.Solicitacao;
import drugdealer.persistencia.exceptions.AlreadyExistsException;
import drugdealer.persistencia.exceptions.DoesNotExistsException;

public class SolicitacaoPersistence extends TablePersistence implements ISolicitacaoPersistence {
	public static String TABLENAME = "solicitacao";
	public static String PRIMARYKEY1 = "cod_consulta";
	public static String PRIMARYKEY2 = "cod_remedio";
	
	/**
	 * @param owner
	 */
	public SolicitacaoPersistence(DDPersistence owner) {
		super(owner);
		this.createTableStmt =
			"CREATE TABLE IF NOT EXISTS " + SolicitacaoPersistence.TABLENAME +
			"(" +
			SolicitacaoPersistence.PRIMARYKEY1 + " integer NOT NULL," +
			SolicitacaoPersistence.PRIMARYKEY2 + " integer NOT NULL," +
			"status integer," +
			"quantidade integer," +
			
			"PRIMARY KEY (" + 
			SolicitacaoPersistence.PRIMARYKEY1 + ", " +
			SolicitacaoPersistence.PRIMARYKEY2 + ")," +
			
			"FOREIGN KEY (" + SolicitacaoPersistence.PRIMARYKEY1  + 
			") REFERENCES " + ConsultaPersistence.TABLENAME + "(" + 
			ConsultaPersistence.PRIMARYKEY +	") ON DELETE CASCADE," +
			
			"FOREIGN KEY (" + SolicitacaoPersistence.PRIMARYKEY2  + 
			") REFERENCES " + RemedioPersistence.TABLENAME +	"(" +
			RemedioPersistence.PRIMARYKEY + ") ON DELETE CASCADE" +
			")";
	}
	
	/* (non-Javadoc)
	 * @see drugdealer.persistencia.ISolicitacaoPersistence#getList(drugdealer.dados.Consulta)
	 */
	public Vector<Solicitacao> getList(Consulta consulta) {
		Vector<Solicitacao> list = new Vector<Solicitacao>();
		String selectList = "SELECT * FROM " + SolicitacaoPersistence.TABLENAME +
				" WHERE " + 
				SolicitacaoPersistence.PRIMARYKEY1 + "=" + consulta.getCodigo();
		
		System.out.println(selectList);
		
		try {
			Statement s = this.ddc.createStatement();
			ResultSet rs = s.executeQuery(selectList);
			
			while (rs.next())
				list.add(new Solicitacao(
						rs.getInt(SolicitacaoPersistence.PRIMARYKEY2),
						rs.getInt("quantidade"),
						(rs.getInt("status") == 0)));
			rs.close ();
			s.close ();
		} catch (SQLException e) {
			e.printStackTrace();
		}
		
		return list;
	}
	
	/* (non-Javadoc)
	 * @see drugdealer.persistencia.ISolicitacaoPersistence#add(drugdealer.dados.Consulta, drugdealer.dados.Solicitacao)
	 */
	public void add(Consulta consulta, Solicitacao solicitacao)
			throws AlreadyExistsException {
		int status;
		if (solicitacao.isStatus())
			status = 1;
		else
			status = 0;
		super.add("INSERT INTO " + SolicitacaoPersistence.TABLENAME + " VALUES (" +
				consulta.getCodigo() + "," + solicitacao.getCodRemedio() + "," + 
				status + "," + solicitacao.getQuantidade() + ")");
	}
	
	/* (non-Javadoc)
	 * @see drugdealer.persistencia.ISolicitacaoPersistence#add(drugdealer.dados.Consulta)
	 */
	public void add(Consulta consulta) throws AlreadyExistsException {
		Iterator it = consulta.getSolicitacoes();
		while (it.hasNext())
			this.add(consulta, (Solicitacao) it.next());
	}
	
	/* (non-Javadoc)
	 * @see drugdealer.persistencia.ISolicitacaoPersistence#update(drugdealer.dados.Consulta, drugdealer.dados.Solicitacao)
	 */
	public void update(Consulta consulta, Solicitacao solicitacao)
			throws DoesNotExistsException {
		int status;
		if (solicitacao.isStatus())
			status = 1;
		else
			status = 0;
		
		super.update("UPDATE " + SolicitacaoPersistence.TABLENAME +
				" SET quantidade='" + solicitacao.getQuantidade() + "'," +
				"status=" + status + " WHERE " +
				SolicitacaoPersistence.PRIMARYKEY1 + "=" + consulta.getCodigo() +
				" AND " + SolicitacaoPersistence.PRIMARYKEY2 + "=" + 
				solicitacao.getCodRemedio());
	}
	
	/* (non-Javadoc)
	 * @see drugdealer.persistencia.ISolicitacaoPersistence#update(drugdealer.dados.Consulta)
	 */
	public void update(Consulta consulta) throws DoesNotExistsException {
		if (consulta != null && consulta.getSolicitacoes() != null) {
			Iterator it = consulta.getSolicitacoes();
			while (it.hasNext())
				this.update(consulta, (Solicitacao) it.next());
		}
	}
	
	/* (non-Javadoc)
	 * @see drugdealer.persistencia.ISolicitacaoPersistence#remove(drugdealer.dados.Consulta, drugdealer.dados.Solicitacao)
	 */
	public void remove(Consulta consulta, Solicitacao solicitacao) {
		super.remove(SolicitacaoPersistence.TABLENAME,
				SolicitacaoPersistence.PRIMARYKEY1, consulta.getCodigo(), 
				SolicitacaoPersistence.PRIMARYKEY2, solicitacao.getCodRemedio());
	}
	
	/* (non-Javadoc)
	 * @see drugdealer.persistencia.ISolicitacaoPersistence#removeAll(drugdealer.dados.Consulta)
	 */
	public void removeAll(Consulta consulta) {
		super.remove(SolicitacaoPersistence.TABLENAME,
				SolicitacaoPersistence.PRIMARYKEY1, consulta.getCodigo());
	}
}
